/**
 * ELement-UI 的 table 中导出Excel表
 */
import XLSX from 'xlsx';
import { saveAs } from 'file-saver';
export default {
  /**
   * 导出 Excel 数据
   * @param {Array} data - 表格数据(从后台不分页查询获取)
   * @param {Object} tableRef - Vue 表格的 ref 对象
   * @param {String} fileName - 导出的文件名
   */
  async exportExcel(data, tableRef, fileName) {
    try {
      // 获取表格列头和列属性
      const { headers, props } = this.extractTableColumns(tableRef);
      // 组织导出数据
      const exportTableData = this.prepareExportData(data, headers, props);
      // 使用 XLSX 将数据转为工作簿
      const ws = XLSX.utils.aoa_to_sheet(exportTableData); // AOA（数组数组）格式
      // 设置表头样式
      // const headerStyle = {
      //   font: { bold: true }, // 加粗字体
      //   alignment: { horizontal: 'center', vertical: 'center' }, // 居中对齐
      //   fill: {
      //     patternType: 'solid',
      //     fgColor: { rgb: 'FFFF00' } // 黄色背景色
      //   }
      // };

      // 应用样式到表头（假设表头在第一行）
      // const range = XLSX.utils.decode_range(ws['!ref']); // 获取工作表的范围
      // for (let col = 0; col <= range.e.c; col++) {
      //   const cell = ws[XLSX.utils.encode_cell({ r: 0, c: col })];
      //   console.log('cell: ', cell);
      //   if (cell) {
      //     cell.s = headerStyle; // 设置表头样式
      //   }
      // }
      // 设置表头行高（第1行是表头）
      // if (!ws['!rows']) ws['!rows'] = [];
      // ws['!rows'][0] = { hpt: 30 }; // 设置第1行的行高（单位为磅）
      const wb = XLSX.utils.book_new(); // 新建工作簿
      XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); // 将工作表添加到工作簿中
      // 导出为 Excel 文件
      const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
      // 使用 FileSaver 保存文件
      saveAs(new Blob([excelBuffer], { type: 'application/octet-stream' }), `${fileName + this.timeFormat()} .xlsx`);
    } catch (error) {
      console.error('导出失败:', error);
      // Vue 中的错误提示
      tableRef.$message.error('导出过程中发生错误');
    }
  },

  // 提取表格列头和对应的属性
  extractTableColumns(tableRef) {
    const headers = [];
    const props = [];
    tableRef.columns.forEach(item => {
      if (item.property) {
        headers.push(item.label);
        props.push(item.property);
      }
    });
    return { headers, props };
  },
  // 准备导出数据
  prepareExportData(data, headers, props) {
    // 将表头添加到导出数据的首行
    const exportData = [headers];
    // 按照列的属性提取每一行的数据
    data.forEach(item => {
      const rowData = props.map(prop => item[prop]);
      exportData.push(rowData);
    });
    return exportData;
  },
  timeFormat() {
    let time = new Date();
    let year = time.getFullYear();
    let month = time.getMonth() + 1;
    let date = time.getDate();
    let hours = time.getHours();
    let minutes = time.getMinutes();
    let seconds = time.getSeconds();
    return year + '-' + this.addZero(month) + '-' + this.addZero(date) + ' ' + this.addZero(hours) + ':' + this.addZero(minutes) + ':' + this.addZero(seconds);
  },
  addZero(num) {
    return num < 10 ? '0' + num : num
  },
};
